home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / MacPerl ƒ / Perl Source ƒ / Perl / arg.h next >
Text File  |  1993-10-23  |  20KB  |  1,025 lines

  1. /* $RCSfile: arg.h,v $$Revision: 4.0.1.3 $$Date: 92/06/08 11:44:06 $
  2.  *
  3.  *    Copyright (c) 1991, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of the Perl Artistic License,
  6.  *    as specified in the README file.
  7.  *
  8.  * $Log:    arg.h,v $
  9.  * Revision 4.0.1.3  92/06/08  11:44:06  lwall
  10.  * patch20: O_PIPE conflicted with Atari
  11.  * patch20: clarified debugging output for literals and double-quoted strings
  12.  * 
  13.  * Revision 4.0.1.2  91/11/05  15:51:05  lwall
  14.  * patch11: added eval {}
  15.  * patch11: added sort {} LIST
  16.  * 
  17.  * Revision 4.0.1.1  91/06/07  10:18:30  lwall
  18.  * patch4: length($`), length($&), length($') now optimized to avoid string copy
  19.  * patch4: new copyright notice
  20.  * patch4: many, many itty-bitty portability fixes
  21.  * 
  22.  * Revision 4.0  91/03/20  01:03:09  lwall
  23.  * 4.0 baseline.
  24.  * 
  25.  */
  26.  
  27. #define O_NULL 0
  28. #define O_RCAT 1
  29. #define O_ITEM 2
  30. #define O_SCALAR 3
  31. #define O_ITEM2 4
  32. #define O_ITEM3 5
  33. #define O_CONCAT 6
  34. #define O_REPEAT 7
  35. #define O_MATCH 8
  36. #define O_NMATCH 9
  37. #define O_SUBST 10
  38. #define O_NSUBST 11
  39. #define O_ASSIGN 12
  40. #define O_LOCAL 13
  41. #define O_AASSIGN 14
  42. #define O_SASSIGN 15
  43. #define O_CHOP 16
  44. #define O_DEFINED 17
  45. #define O_UNDEF 18
  46. #define O_STUDY 19
  47. #define O_POW 20
  48. #define O_MULTIPLY 21
  49. #define O_DIVIDE 22
  50. #define O_MODULO 23
  51. #define O_ADD 24
  52. #define O_SUBTRACT 25
  53. #define O_LEFT_SHIFT 26
  54. #define O_RIGHT_SHIFT 27
  55. #define O_LT 28
  56. #define O_GT 29
  57. #define O_LE 30
  58. #define O_GE 31
  59. #define O_EQ 32
  60. #define O_NE 33
  61. #define O_NCMP 34
  62. #define O_BIT_AND 35
  63. #define O_XOR 36
  64. #define O_BIT_OR 37
  65. #define O_AND 38
  66. #define O_OR 39
  67. #define O_COND_EXPR 40
  68. #define O_COMMA 41
  69. #define O_NEGATE 42
  70. #define O_NOT 43
  71. #define O_COMPLEMENT 44
  72. #define O_SELECT 45
  73. #define O_WRITE 46
  74. #define O_DBMOPEN 47
  75. #define O_DBMCLOSE 48
  76. #define O_OPEN 49
  77. #define O_TRANS 50
  78. #define O_NTRANS 51
  79. #define O_CLOSE 52
  80. #define O_EACH 53
  81. #define O_VALUES 54
  82. #define O_KEYS 55
  83. #define O_LARRAY 56
  84. #define O_ARRAY 57
  85. #define O_AELEM 58
  86. #define O_DELETE 59
  87. #define O_LHASH 60
  88. #define O_HASH 61
  89. #define O_HELEM 62
  90. #define O_LAELEM 63
  91. #define O_LHELEM 64
  92. #define O_LSLICE 65
  93. #define O_ASLICE 66
  94. #define O_HSLICE 67
  95. #define O_LASLICE 68
  96. #define O_LHSLICE 69
  97. #define O_SPLICE 70
  98. #define O_PUSH 71
  99. #define O_POP 72
  100. #define O_SHIFT 73
  101. #define O_UNPACK 74
  102. #define O_SPLIT 75
  103. #define O_LENGTH 76
  104. #define O_SPRINTF 77
  105. #define O_SUBSTR 78
  106. #define O_PACK 79
  107. #define O_GREP 80
  108. #define O_JOIN 81
  109. #define O_SLT 82
  110. #define O_SGT 83
  111. #define O_SLE 84
  112. #define O_SGE 85
  113. #define O_SEQ 86
  114. #define O_SNE 87
  115. #define O_SCMP 88
  116. #define O_SUBR 89
  117. #define O_DBSUBR 90
  118. #define O_CALLER 91
  119. #define O_SORT 92
  120. #define O_REVERSE 93
  121. #define O_WARN 94
  122. #define O_DIE 95
  123. #define O_PRTF 96
  124. #define O_PRINT 97
  125. #define O_CHDIR 98
  126. #define O_EXIT 99
  127. #define O_RESET 100
  128. #define O_LIST 101
  129. #define O_EOF 102
  130. #define O_GETC 103
  131. #define O_TELL 104
  132. #define O_RECV 105
  133. #define O_READ 106
  134. #define O_SYSREAD 107
  135. #define O_SYSWRITE 108
  136. #define O_SEND 109
  137. #define O_SEEK 110
  138. #define O_RETURN 111
  139. #define O_REDO 112
  140. #define O_NEXT 113
  141. #define O_LAST 114
  142. #define O_DUMP 115
  143. #define O_GOTO 116
  144. #define O_INDEX 117
  145. #define O_RINDEX 118
  146. #define O_TIME 119
  147. #define O_TMS 120
  148. #define O_LOCALTIME 121
  149. #define O_GMTIME 122
  150. #define O_TRUNCATE 123
  151. #define O_LSTAT 124
  152. #define O_STAT 125
  153. #define O_CRYPT 126
  154. #define O_ATAN2 127
  155. #define O_SIN 128
  156. #define O_COS 129
  157. #define O_RAND 130
  158. #define O_SRAND 131
  159. #define O_EXP 132
  160. #define O_LOG 133
  161. #define O_SQRT 134
  162. #define O_INT 135
  163. #define O_ORD 136
  164. #define O_ALARM 137
  165. #define O_SLEEP 138
  166. #define O_RANGE 139
  167. #define O_F_OR_R 140
  168. #define O_FLIP 141
  169. #define O_FLOP 142
  170. #define O_FORK 143
  171. #define O_WAIT 144
  172. #define O_WAITPID 145
  173. #define O_SYSTEM 146
  174. #define O_EXEC_OP 147
  175. #define O_HEX 148
  176. #define O_OCT 149
  177. #define O_CHOWN 150
  178. #define O_KILL 151
  179. #define O_UNLINK 152
  180. #define O_CHMOD 153
  181. #define O_UTIME 154
  182. #define O_UMASK 155
  183. #define O_MSGGET 156
  184. #define O_SHMGET 157
  185. #define O_SEMGET 158
  186. #define O_MSGCTL 159
  187. #define O_SHMCTL 160
  188. #define O_SEMCTL 161
  189. #define O_MSGSND 162
  190. #define O_MSGRCV 163
  191. #define O_SEMOP 164
  192. #define O_SHMREAD 165
  193. #define O_SHMWRITE 166
  194. #define O_RENAME 167
  195. #define O_LINK 168
  196. #define O_MKDIR 169
  197. #define O_RMDIR 170
  198. #define O_GETPPID 171
  199. #define O_GETPGRP 172
  200. #define O_SETPGRP 173
  201. #define O_GETPRIORITY 174
  202. #define O_SETPRIORITY 175
  203. #define O_CHROOT 176
  204. #define O_FCNTL 177
  205. #define O_IOCTL 178
  206. #define O_FLOCK 179
  207. #define O_UNSHIFT 180
  208. #define O_REQUIRE 181
  209. #define O_DOFILE 182
  210. #define O_EVAL 183
  211. #define O_FTRREAD 184
  212. #define O_FTRWRITE 185
  213. #define O_FTREXEC 186
  214. #define O_FTEREAD 187
  215. #define O_FTEWRITE 188
  216. #define O_FTEEXEC 189
  217. #define O_FTIS 190
  218. #define O_FTEOWNED 191
  219. #define O_FTROWNED 192
  220. #define O_FTZERO 193
  221. #define O_FTSIZE 194
  222. #define O_FTMTIME 195
  223. #define O_FTATIME 196
  224. #define O_FTCTIME 197
  225. #define O_FTSOCK 198
  226. #define O_FTCHR 199
  227. #define O_FTBLK 200
  228. #define O_FTFILE 201
  229. #define O_FTDIR 202
  230. #define O_FTPIPE 203
  231. #define O_FTLINK 204
  232. #define O_SYMLINK 205
  233. #define O_READLINK 206
  234. #define O_FTSUID 207
  235. #define O_FTSGID 208
  236. #define O_FTSVTX 209
  237. #define O_FTTTY 210
  238. #define O_FTTEXT 211
  239. #define O_FTBINARY 212
  240. #define O_SOCKET 213
  241. #define O_BIND 214
  242. #define O_CONNECT 215
  243. #define O_LISTEN 216
  244. #define O_ACCEPT 217
  245. #define O_GHBYNAME 218
  246. #define O_GHBYADDR 219
  247. #define O_GHOSTENT 220
  248. #define O_GNBYNAME 221
  249. #define O_GNBYADDR 222
  250. #define O_GNETENT 223
  251. #define O_GPBYNAME 224
  252. #define O_GPBYNUMBER 225
  253. #define O_GPROTOENT 226
  254. #define O_GSBYNAME 227
  255. #define O_GSBYPORT 228
  256. #define O_GSERVENT 229
  257. #define O_SHOSTENT 230
  258. #define O_SNETENT 231
  259. #define O_SPROTOENT 232
  260. #define O_SSERVENT 233
  261. #define O_EHOSTENT 234
  262. #define O_ENETENT 235
  263. #define O_EPROTOENT 236
  264. #define O_ESERVENT 237
  265. #define O_SOCKPAIR 238
  266. #define O_SHUTDOWN 239
  267. #define O_GSOCKOPT 240
  268. #define O_SSOCKOPT 241
  269. #define O_GETSOCKNAME 242
  270. #define O_GETPEERNAME 243
  271. #define O_SSELECT 244
  272. #define O_FILENO 245
  273. #define O_BINMODE 246
  274. #define O_VEC 247
  275. #define O_GPWNAM 248
  276. #define O_GPWUID 249
  277. #define O_GPWENT 250
  278. #define O_SPWENT 251
  279. #define O_EPWENT 252
  280. #define O_GGRNAM 253
  281. #define O_GGRGID 254
  282. #define O_GGRENT 255
  283. #define O_SGRENT 256
  284. #define O_EGRENT 257
  285. #define O_GETLOGIN 258
  286. #define O_OPEN_DIR 259
  287. #define O_READDIR 260
  288. #define O_TELLDIR 261
  289. #define O_SEEKDIR 262
  290. #define O_REWINDDIR 263
  291. #define O_CLOSEDIR 264
  292. #define O_SYSCALL 265
  293. #define O_PIPE_OP 266
  294. #define O_TRY 267
  295. #define O_EVALONCE 268
  296. #ifdef macintosh
  297. #define O_CHOOSE 269
  298. #define O_ASK 270
  299. #define O_ANSWER 271
  300. #define O_PICK 272
  301. #define MAXO 273
  302. #else
  303. #define MAXO 269
  304. #endif
  305.  
  306. #ifndef DOINIT
  307. extern char *opname[];
  308. #else
  309. char *opname[] = {
  310.     "NULL",
  311.     "RCAT",
  312.     "ITEM",
  313.     "SCALAR",
  314.     "ITEM2",
  315.     "ITEM3",
  316.     "CONCAT",
  317.     "REPEAT",
  318.     "MATCH",
  319.     "NMATCH",
  320.     "SUBST",
  321.     "NSUBST",
  322.     "ASSIGN",
  323.     "LOCAL",
  324.     "AASSIGN",
  325.     "SASSIGN",
  326.     "CHOP",
  327.     "DEFINED",
  328.     "UNDEF",
  329.     "STUDY",
  330.     "POW",
  331.     "MULTIPLY",
  332.     "DIVIDE",
  333.     "MODULO",
  334.     "ADD",
  335.     "SUBTRACT",
  336.     "LEFT_SHIFT",
  337.     "RIGHT_SHIFT",
  338.     "LT",
  339.     "GT",
  340.     "LE",
  341.     "GE",
  342.     "EQ",
  343.     "NE",
  344.     "NCMP",
  345.     "BIT_AND",
  346.     "XOR",
  347.     "BIT_OR",
  348.     "AND",
  349.     "OR",
  350.     "COND_EXPR",
  351.     "COMMA",
  352.     "NEGATE",
  353.     "NOT",
  354.     "COMPLEMENT",
  355.     "SELECT",
  356.     "WRITE",
  357.     "DBMOPEN",
  358.     "DBMCLOSE",
  359.     "OPEN",
  360.     "TRANS",
  361.     "NTRANS",
  362.     "CLOSE",
  363.     "EACH",
  364.     "VALUES",
  365.     "KEYS",
  366.     "LARRAY",
  367.     "ARRAY",
  368.     "AELEM",
  369.     "DELETE",
  370.     "LHASH",
  371.     "HASH",
  372.     "HELEM",
  373.     "LAELEM",
  374.     "LHELEM",
  375.     "LSLICE",
  376.     "ASLICE",
  377.     "HSLICE",
  378.     "LASLICE",
  379.     "LHSLICE",
  380.     "SPLICE",
  381.     "PUSH",
  382.     "POP",
  383.     "SHIFT",
  384.     "UNPACK",
  385.     "SPLIT",
  386.     "LENGTH",
  387.     "SPRINTF",
  388.     "SUBSTR",
  389.     "PACK",
  390.     "GREP",
  391.     "JOIN",
  392.     "SLT",
  393.     "SGT",
  394.     "SLE",
  395.     "SGE",
  396.     "SEQ",
  397.     "SNE",
  398.     "SCMP",
  399.     "SUBR",
  400.     "DBSUBR",
  401.     "CALLER",
  402.     "SORT",
  403.     "REVERSE",
  404.     "WARN",
  405.     "DIE",
  406.     "PRINTF",
  407.     "PRINT",
  408.     "CHDIR",
  409.     "EXIT",
  410.     "RESET",
  411.     "LIST",
  412.     "EOF",
  413.     "GETC",
  414.     "TELL",
  415.     "RECV",
  416.     "READ",
  417.     "SYSREAD",
  418.     "SYSWRITE",
  419.     "SEND",
  420.     "SEEK",
  421.     "RETURN",
  422.     "REDO",
  423.     "NEXT",
  424.     "LAST",
  425.     "DUMP",
  426.     "GOTO",/* shudder */
  427.     "INDEX",
  428.     "RINDEX",
  429.     "TIME",
  430.     "TIMES",
  431.     "LOCALTIME",
  432.     "GMTIME",
  433.     "TRUNCATE",
  434.     "LSTAT",
  435.     "STAT",
  436.     "CRYPT",
  437.     "ATAN2",
  438.     "SIN",
  439.     "COS",
  440.     "RAND",
  441.     "SRAND",
  442.     "EXP",
  443.     "LOG",
  444.     "SQRT",
  445.     "INT",
  446.     "ORD",
  447.     "ALARM",
  448.     "SLEEP",
  449.     "RANGE",
  450.     "FLIP_OR_RANGE",
  451.     "FLIP",
  452.     "FLOP",
  453.     "FORK",
  454.     "WAIT",
  455.     "WAITPID",
  456.     "SYSTEM",
  457.     "EXEC",
  458.     "HEX",
  459.     "OCT",
  460.     "CHOWN",
  461.     "KILL",
  462.     "UNLINK",
  463.     "CHMOD",
  464.     "UTIME",
  465.     "UMASK",
  466.     "MSGGET",
  467.     "SHMGET",
  468.     "SEMGET",
  469.     "MSGCTL",
  470.     "SHMCTL",
  471.     "SEMCTL",
  472.     "MSGSND",
  473.     "MSGRCV",
  474.     "SEMOP",
  475.     "SHMREAD",
  476.     "SHMWRITE",
  477.     "RENAME",
  478.     "LINK",
  479.     "MKDIR",
  480.     "RMDIR",
  481.     "GETPPID",
  482.     "GETPGRP",
  483.     "SETPGRP",
  484.     "GETPRIORITY",
  485.     "SETPRIORITY",
  486.     "CHROOT",
  487.     "FCNTL",
  488.     "SYSIOCTL",
  489.     "FLOCK",
  490.     "UNSHIFT",
  491.     "REQUIRE",
  492.     "DOFILE",
  493.     "EVAL",
  494.     "FTRREAD",
  495.     "FTRWRITE",
  496.     "FTREXEC",
  497.     "FTEREAD",
  498.     "FTEWRITE",
  499.     "FTEEXEC",
  500.     "FTIS",
  501.     "FTEOWNED",
  502.     "FTROWNED",
  503.     "FTZERO",
  504.     "FTSIZE",
  505.     "FTMTIME",
  506.     "FTATIME",
  507.     "FTCTIME",
  508.     "FTSOCK",
  509.     "FTCHR",
  510.     "FTBLK",
  511.     "FTFILE",
  512.     "FTDIR",
  513.     "FTPIPE",
  514.     "FTLINK",
  515.     "SYMLINK",
  516.     "READLINK",
  517.     "FTSUID",
  518.     "FTSGID",
  519.     "FTSVTX",
  520.     "FTTTY",
  521.     "FTTEXT",
  522.     "FTBINARY",
  523.     "SOCKET",
  524.     "BIND",
  525.     "CONNECT",
  526.     "LISTEN",
  527.     "ACCEPT",
  528.     "GHBYNAME",
  529.     "GHBYADDR",
  530.     "GHOSTENT",
  531.     "GNBYNAME",
  532.     "GNBYADDR",
  533.     "GNETENT",
  534.     "GPBYNAME",
  535.     "GPBYNUMBER",
  536.     "GPROTOENT",
  537.     "GSBYNAME",
  538.     "GSBYPORT",
  539.     "GSERVENT",
  540.     "SHOSTENT",
  541.     "SNETENT",
  542.     "SPROTOENT",
  543.     "SSERVENT",
  544.     "EHOSTENT",
  545.     "ENETENT",
  546.     "EPROTOENT",
  547.     "ESERVENT",
  548.     "SOCKPAIR",
  549.     "SHUTDOWN",
  550.     "GSOCKOPT",
  551.     "SSOCKOPT",
  552.     "GETSOCKNAME",
  553.     "GETPEERNAME",
  554.     "SSELECT",
  555.     "FILENO",
  556.     "BINMODE",
  557.     "VEC",
  558.     "GPWNAM",
  559.     "GPWUID",
  560.     "GPWENT",
  561.     "SPWENT",
  562.     "EPWENT",
  563.     "GGRNAM",
  564.     "GGRGID",
  565.     "GGRENT",
  566.     "SGRENT",
  567.     "EGRENT",
  568.     "GETLOGIN",
  569.     "OPENDIR",
  570.     "READDIR",
  571.     "TELLDIR",
  572.     "SEEKDIR",
  573.     "REWINDDIR",
  574.     "CLOSEDIR",
  575.     "SYSCALL",
  576.     "PIPE",
  577.     "TRY",
  578.     "EVALONCE",
  579. #ifdef macintosh
  580.     "CHOOSE",
  581.      "ASK",
  582.      "ANSWER",
  583.      "PICK",
  584.      "273"
  585. #else
  586.     "269"
  587. #endif
  588. };
  589. #endif
  590.  
  591. #define A_NULL 0
  592. #define A_EXPR 1
  593. #define A_CMD 2
  594. #define A_STAB 3
  595. #define A_LVAL 4
  596. #define A_SINGLE 5
  597. #define A_DOUBLE 6
  598. #define A_BACKTICK 7
  599. #define A_READ 8
  600. #define A_SPAT 9
  601. #define A_LEXPR 10
  602. #define A_ARYLEN 11
  603. #define A_ARYSTAB 12
  604. #define A_LARYLEN 13
  605. #define A_GLOB 14
  606. #define A_WORD 15
  607. #define A_INDREAD 16
  608. #define A_LARYSTAB 17
  609. #define A_STAR 18
  610. #define A_LSTAR 19
  611. #define A_WANTARRAY 20
  612. #define A_LENSTAB 21
  613.  
  614. #define A_MASK 31
  615. #define A_DONT 32        /* or this into type to suppress evaluation */
  616.  
  617. #ifndef DOINIT
  618. extern char *argname[];
  619. #else
  620. char *argname[] = {
  621.     "A_NULL",
  622.     "EXPR",
  623.     "CMD",
  624.     "STAB",
  625.     "LVAL",
  626.     "LITERAL",
  627.     "DOUBLEQUOTE",
  628.     "BACKTICK",
  629.     "READ",
  630.     "SPAT",
  631.     "LEXPR",
  632.     "ARYLEN",
  633.     "ARYSTAB",
  634.     "LARYLEN",
  635.     "GLOB",
  636.     "WORD",
  637.     "INDREAD",
  638.     "LARYSTAB",
  639.     "STAR",
  640.     "LSTAR",
  641.     "WANTARRAY",
  642.     "LENSTAB",
  643.     "22"
  644. };
  645. #endif
  646.  
  647. #ifndef DOINIT
  648. extern bool hoistable[];
  649. #else
  650. bool hoistable[] =
  651.   {0,    /* A_NULL */
  652.    0,    /* EXPR */
  653.    1,    /* CMD */
  654.    1,    /* STAB */
  655.    0,    /* LVAL */
  656.    1,    /* SINGLE */
  657.    0,    /* DOUBLE */
  658.    0,    /* BACKTICK */
  659.    0,    /* READ */
  660.    0,    /* SPAT */
  661.    0,    /* LEXPR */
  662.    1,    /* ARYLEN */
  663.    1,    /* ARYSTAB */
  664.    0,    /* LARYLEN */
  665.    0,    /* GLOB */
  666.    1,    /* WORD */
  667.    0,    /* INDREAD */
  668.    0,    /* LARYSTAB */
  669.    1,    /* STAR */
  670.    1,    /* LSTAR */
  671.    1,    /* WANTARRAY */
  672.    0,    /* LENSTAB */
  673.    0,    /* 21 */
  674. };
  675. #endif
  676.  
  677. union argptr {
  678.     ARG        *arg_arg;
  679.     char    *arg_cval;
  680.     STAB    *arg_stab;
  681.     SPAT    *arg_spat;
  682.     CMD        *arg_cmd;
  683.     STR        *arg_str;
  684.     HASH    *arg_hash;
  685. };
  686.  
  687. struct arg {
  688.     union argptr arg_ptr;
  689.     short    arg_len;
  690.     unsigned short arg_type;
  691.     unsigned short arg_flags;
  692. };
  693.  
  694. #define AF_ARYOK 1        /* op can handle multiple values here */
  695. #define AF_POST 2        /* post *crement this item */
  696. #define AF_PRE 4        /* pre *crement this item */
  697. #define AF_UP 8            /* increment rather than decrement */
  698. #define AF_COMMON 16        /* left and right have symbols in common */
  699. #define AF_DEPR 32        /* an older form of the construct */
  700. #define AF_LISTISH 64        /* turn into list if important */
  701. #define AF_LOCAL 128        /* list of local variables */
  702.  
  703. /*
  704.  * Most of the ARG pointers are used as pointers to arrays of ARG.  When
  705.  * so used, the 0th element is special, and represents the operator to
  706.  * use on the list of arguments following.  The arg_len in the 0th element
  707.  * gives the maximum argument number, and the arg_str is used to store
  708.  * the return value in a more-or-less static location.  Sorry it's not
  709.  * re-entrant (yet), but it sure makes it efficient.  The arg_type of the
  710.  * 0th element is an operator (O_*) rather than an argument type (A_*).
  711.  */
  712.  
  713. #define Nullarg Null(ARG*)
  714.  
  715. #ifndef DOINIT
  716. EXT unsigned short opargs[MAXO+1];
  717. #else
  718. #define A(e1,e2,e3)        (e1+(e2<<2)+(e3<<4))
  719. #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
  720. #ifdef macintosh
  721. #define A6(e1,e2,e3,e4,e5,e6) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8)+(e6<<10))
  722. #endif
  723. unsigned short opargs[MAXO+1] = {
  724.     A(0,0,0),    /* NULL */
  725.     A(1,1,0),    /* RCAT */
  726.     A(1,0,0),    /* ITEM */
  727.     A(1,0,0),    /* SCALAR */
  728.     A(0,0,0),    /* ITEM2 */
  729.     A(0,0,0),    /* ITEM3 */
  730.     A(1,1,0),    /* CONCAT */
  731.     A(3,1,0),    /* REPEAT */
  732.     A(1,0,0),    /* MATCH */
  733.     A(1,0,0),    /* NMATCH */
  734.     A(1,0,0),    /* SUBST */
  735.     A(1,0,0),    /* NSUBST */
  736.     A(1,1,0),    /* ASSIGN */
  737.     A(1,0,0),    /* LOCAL */
  738.     A(3,3,0),    /* AASSIGN */
  739.     A(0,0,0),    /* SASSIGN */
  740.     A(3,0,0),    /* CHOP */
  741.     A(1,0,0),    /* DEFINED */
  742.     A(1,0,0),    /* UNDEF */
  743.     A(1,0,0),    /* STUDY */
  744.     A(1,1,0),    /* POW */
  745.     A(1,1,0),    /* MULTIPLY */
  746.     A(1,1,0),    /* DIVIDE */
  747.     A(1,1,0),    /* MODULO */
  748.     A(1,1,0),    /* ADD */
  749.     A(1,1,0),    /* SUBTRACT */
  750.     A(1,1,0),    /* LEFT_SHIFT */
  751.     A(1,1,0),    /* RIGHT_SHIFT */
  752.     A(1,1,0),    /* LT */
  753.     A(1,1,0),    /* GT */
  754.     A(1,1,0),    /* LE */
  755.     A(1,1,0),    /* GE */
  756.     A(1,1,0),    /* EQ */
  757.     A(1,1,0),    /* NE */
  758.     A(1,1,0),    /* NCMP */
  759.     A(1,1,0),    /* BIT_AND */
  760.     A(1,1,0),    /* XOR */
  761.     A(1,1,0),    /* BIT_OR */
  762.     A(1,0,0),    /* AND */
  763.     A(1,0,0),    /* OR */
  764.     A(1,0,0),    /* COND_EXPR */
  765.     A(1,1,0),    /* COMMA */
  766.     A(1,0,0),    /* NEGATE */
  767.     A(1,0,0),    /* NOT */
  768.     A(1,0,0),    /* COMPLEMENT */
  769.     A(1,0,0),    /* SELECT */
  770.     A(1,0,0),    /* WRITE */
  771.     A(1,1,1),    /* DBMOPEN */
  772.     A(1,0,0),    /* DBMCLOSE */
  773.     A(1,1,0),    /* OPEN */
  774.     A(1,0,0),    /* TRANS */
  775.     A(1,0,0),    /* NTRANS */
  776.     A(1,0,0),    /* CLOSE */
  777.     A(0,0,0),    /* EACH */
  778.     A(0,0,0),    /* VALUES */
  779.     A(0,0,0),    /* KEYS */
  780.     A(0,0,0),    /* LARRAY */
  781.     A(0,0,0),    /* ARRAY */
  782.     A(0,1,0),    /* AELEM */
  783.     A(0,1,0),    /* DELETE */
  784.     A(0,0,0),    /* LHASH */
  785.     A(0,0,0),    /* HASH */
  786.     A(0,1,0),    /* HELEM */
  787.     A(0,1,0),    /* LAELEM */
  788.     A(0,1,0),    /* LHELEM */
  789.     A(0,3,3),    /* LSLICE */
  790.     A(0,3,0),    /* ASLICE */
  791.     A(0,3,0),    /* HSLICE */
  792.     A(0,3,0),    /* LASLICE */
  793.     A(0,3,0),    /* LHSLICE */
  794.     A(0,3,1),    /* SPLICE */
  795.     A(0,3,0),    /* PUSH */
  796.     A(0,0,0),    /* POP */
  797.     A(0,0,0),    /* SHIFT */
  798.     A(1,1,0),    /* UNPACK */
  799.     A(1,0,1),    /* SPLIT */
  800.     A(1,0,0),    /* LENGTH */
  801.     A(3,0,0),    /* SPRINTF */
  802.     A(1,1,1),    /* SUBSTR */
  803.     A(1,3,0),    /* PACK */
  804.     A(0,3,0),    /* GREP */
  805.     A(1,3,0),    /* JOIN */
  806.     A(1,1,0),    /* SLT */
  807.     A(1,1,0),    /* SGT */
  808.     A(1,1,0),    /* SLE */
  809.     A(1,1,0),    /* SGE */
  810.     A(1,1,0),    /* SEQ */
  811.     A(1,1,0),    /* SNE */
  812.     A(1,1,0),    /* SCMP */
  813.     A(0,3,0),    /* SUBR */
  814.     A(0,3,0),    /* DBSUBR */
  815.     A(1,0,0),    /* CALLER */
  816.     A(1,3,0),    /* SORT */
  817.     A(0,3,0),    /* REVERSE */
  818.     A(0,3,0),    /* WARN */
  819.     A(0,3,0),    /* DIE */
  820.     A(1,3,0),    /* PRINTF */
  821.     A(1,3,0),    /* PRINT */
  822.     A(1,0,0),    /* CHDIR */
  823.     A(1,0,0),    /* EXIT */
  824.     A(1,0,0),    /* RESET */
  825.     A(3,0,0),    /* LIST */
  826.     A(1,0,0),    /* EOF */
  827.     A(1,0,0),    /* GETC */
  828.     A(1,0,0),    /* TELL */
  829.     A5(1,1,1,1,0),    /* RECV */
  830.     A(1,1,3),    /* READ */
  831.     A(1,1,3),    /* SYSREAD */
  832.     A(1,1,3),    /* SYSWRITE */
  833.     A(1,1,3),    /* SEND */
  834.     A(1,1,1),    /* SEEK */
  835.     A(0,3,0),    /* RETURN */
  836.     A(0,0,0),    /* REDO */
  837.     A(0,0,0),    /* NEXT */
  838.     A(0,0,0),    /* LAST */
  839.     A(0,0,0),    /* DUMP */
  840.     A(0,0,0),    /* GOTO */
  841.     A(1,1,1),    /* INDEX */
  842.     A(1,1,1),    /* RINDEX */
  843.     A(0,0,0),    /* TIME */
  844.     A(0,0,0),    /* TIMES */
  845.     A(1,0,0),    /* LOCALTIME */
  846.     A(1,0,0),    /* GMTIME */
  847.     A(1,1,0),    /* TRUNCATE */
  848.     A(1,0,0),    /* LSTAT */
  849.     A(1,0,0),    /* STAT */
  850.     A(1,1,0),    /* CRYPT */
  851.     A(1,1,0),    /* ATAN2 */
  852.     A(1,0,0),    /* SIN */
  853.     A(1,0,0),    /* COS */
  854.     A(1,0,0),    /* RAND */
  855.     A(1,0,0),    /* SRAND */
  856.     A(1,0,0),    /* EXP */
  857.     A(1,0,0),    /* LOG */
  858.     A(1,0,0),    /* SQRT */
  859.     A(1,0,0),    /* INT */
  860.     A(1,0,0),    /* ORD */
  861.     A(1,0,0),    /* ALARM */
  862.     A(1,0,0),    /* SLEEP */
  863.     A(1,1,0),    /* RANGE */
  864.     A(1,0,0),    /* F_OR_R */
  865.     A(1,0,0),    /* FLIP */
  866.     A(0,1,0),    /* FLOP */
  867.     A(0,0,0),    /* FORK */
  868.     A(0,0,0),    /* WAIT */
  869.     A(1,1,0),    /* WAITPID */
  870.     A(1,3,0),    /* SYSTEM */
  871.     A(1,3,0),    /* EXEC */
  872.     A(1,0,0),    /* HEX */
  873.     A(1,0,0),    /* OCT */
  874.     A(0,3,0),    /* CHOWN */
  875.     A(0,3,0),    /* KILL */
  876.     A(0,3,0),    /* UNLINK */
  877.     A(0,3,0),    /* CHMOD */
  878.     A(0,3,0),    /* UTIME */
  879.     A(1,0,0),    /* UMASK */
  880.     A(1,1,0),    /* MSGGET */
  881.     A(1,1,1),    /* SHMGET */
  882.     A(1,1,1),    /* SEMGET */
  883.     A(1,1,1),    /* MSGCTL */
  884.     A(1,1,1),    /* SHMCTL */
  885.     A5(1,1,1,1,0),    /* SEMCTL */
  886.     A(1,1,1),    /* MSGSND */
  887.     A5(1,1,1,1,1),    /* MSGRCV */
  888.     A(1,1,1),    /* SEMOP */
  889.     A5(1,1,1,1,0),    /* SHMREAD */
  890.     A5(1,1,1,1,0),    /* SHMWRITE */
  891.     A(1,1,0),    /* RENAME */
  892.     A(1,1,0),    /* LINK */
  893.     A(1,1,0),    /* MKDIR */
  894.     A(1,0,0),    /* RMDIR */
  895.     A(0,0,0),    /* GETPPID */
  896.     A(1,0,0),    /* GETPGRP */
  897.     A(1,1,0),    /* SETPGRP */
  898.     A(1,1,0),    /* GETPRIORITY */
  899.     A(1,1,1),    /* SETPRIORITY */
  900.     A(1,0,0),    /* CHROOT */
  901.     A(1,1,1),    /* FCNTL */
  902.     A(1,1,1),    /* SYSIOCTL */
  903.     A(1,1,0),    /* FLOCK */
  904.     A(0,3,0),    /* UNSHIFT */
  905.     A(1,0,0),    /* REQUIRE */
  906.     A(1,0,0),    /* DOFILE */
  907.     A(1,0,0),    /* EVAL */
  908.     A(1,0,0),    /* FTRREAD */
  909.     A(1,0,0),    /* FTRWRITE */
  910.     A(1,0,0),    /* FTREXEC */
  911.     A(1,0,0),    /* FTEREAD */
  912.     A(1,0,0),    /* FTEWRITE */
  913.     A(1,0,0),    /* FTEEXEC */
  914.     A(1,0,0),    /* FTIS */
  915.     A(1,0,0),    /* FTEOWNED */
  916.     A(1,0,0),    /* FTROWNED */
  917.     A(1,0,0),    /* FTZERO */
  918.     A(1,0,0),    /* FTSIZE */
  919.     A(1,0,0),    /* FTMTIME */
  920.     A(1,0,0),    /* FTATIME */
  921.     A(1,0,0),    /* FTCTIME */
  922.     A(1,0,0),    /* FTSOCK */
  923.     A(1,0,0),    /* FTCHR */
  924.     A(1,0,0),    /* FTBLK */
  925.     A(1,0,0),    /* FTFILE */
  926.     A(1,0,0),    /* FTDIR */
  927.     A(1,0,0),    /* FTPIPE */
  928.     A(1,0,0),    /* FTLINK */
  929.     A(1,1,0),    /* SYMLINK */
  930.     A(1,0,0),    /* READLINK */
  931.     A(1,0,0),    /* FTSUID */
  932.     A(1,0,0),    /* FTSGID */
  933.     A(1,0,0),    /* FTSVTX */
  934.     A(1,0,0),    /* FTTTY */
  935.     A(1,0,0),    /* FTTEXT */
  936.     A(1,0,0),    /* FTBINARY */
  937.     A5(1,1,1,1,0),    /* SOCKET */
  938.     A(1,1,0),    /* BIND */
  939.     A(1,1,0),    /* CONNECT */
  940.     A(1,1,0),    /* LISTEN */
  941.     A(1,1,0),    /* ACCEPT */
  942.     A(1,0,0),    /* GHBYNAME */
  943.     A(1,1,0),    /* GHBYADDR */
  944.     A(0,0,0),    /* GHOSTENT */
  945.     A(1,0,0),    /* GNBYNAME */
  946.     A(1,1,0),    /* GNBYADDR */
  947.     A(0,0,0),    /* GNETENT */
  948.     A(1,0,0),    /* GPBYNAME */
  949.     A(1,0,0),    /* GPBYNUMBER */
  950.     A(0,0,0),    /* GPROTOENT */
  951.     A(1,1,0),    /* GSBYNAME */
  952.     A(1,1,0),    /* GSBYPORT */
  953.     A(0,0,0),    /* GSERVENT */
  954.     A(1,0,0),    /* SHOSTENT */
  955.     A(1,0,0),    /* SNETENT */
  956.     A(1,0,0),    /* SPROTOENT */
  957.     A(1,0,0),    /* SSERVENT */
  958.     A(0,0,0),    /* EHOSTENT */
  959.     A(0,0,0),    /* ENETENT */
  960.     A(0,0,0),    /* EPROTOENT */
  961.     A(0,0,0),    /* ESERVENT */
  962.     A5(1,1,1,1,1),    /* SOCKPAIR */
  963.     A(1,1,0),    /* SHUTDOWN */
  964.     A(1,1,1),    /* GSOCKOPT */
  965.     A5(1,1,1,1,0),    /* SSOCKOPT */
  966.     A(1,0,0),    /* GETSOCKNAME */
  967.     A(1,0,0),    /* GETPEERNAME */
  968.     A5(1,1,1,1,0),    /* SSELECT */
  969.     A(1,0,0),    /* FILENO */
  970.     A(1,0,0),    /* BINMODE */
  971.     A(1,1,1),    /* VEC */
  972.     A(1,0,0),    /* GPWNAM */
  973.     A(1,0,0),    /* GPWUID */
  974.     A(0,0,0),    /* GPWENT */
  975.     A(0,0,0),    /* SPWENT */
  976.     A(0,0,0),    /* EPWENT */
  977.     A(1,0,0),    /* GGRNAM */
  978.     A(1,0,0),    /* GGRGID */
  979.     A(0,0,0),    /* GGRENT */
  980.     A(0,0,0),    /* SGRENT */
  981.     A(0,0,0),    /* EGRENT */
  982.     A(0,0,0),    /* GETLOGIN */
  983.     A(1,1,0),    /* OPENDIR */
  984.     A(1,0,0),    /* READDIR */
  985.     A(1,0,0),    /* TELLDIR */
  986.     A(1,1,0),    /* SEEKDIR */
  987.     A(1,0,0),    /* REWINDDIR */
  988.     A(1,0,0),    /* CLOSEDIR */
  989.     A(1,3,0),    /* SYSCALL */
  990.     A(1,1,0),    /* PIPE */
  991.     A(0,0,0),    /* TRY */
  992.     A(1,0,0),    /* EVALONCE */
  993. #ifdef macintosh
  994.     A6(1,1,1,1,1,1),    /* CHOOSE */
  995.     A(1,1,0),            /* ASK */
  996.     A(1,3,0),            /* ANSWER */
  997.     A(1,3,0),            /* PICK */
  998. #endif
  999.     0
  1000. };
  1001. #undef A
  1002. #undef A5
  1003. #ifdef macintosh
  1004. #undef A6
  1005. #endif
  1006. #endif
  1007.  
  1008. int do_trans();
  1009. int do_split();
  1010. bool do_eof();
  1011. long do_tell();
  1012. bool do_seek();
  1013. int do_tms();
  1014. int do_time();
  1015. int do_stat();
  1016. STR *do_push();
  1017. FILE *nextargv();
  1018. STR *do_fttext();
  1019. int do_slice();
  1020. #ifdef macintosh
  1021. STR *do_choose();
  1022. double do_answer();
  1023. STR *do_ask();
  1024. STR *do_pick();
  1025. #endif